home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
data
/
happypas
/
hitblow.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-11-30
|
4KB
|
131 lines
{*********************************************************************
* *** HIT & BLOW GAME *** *
* *
* HAPPyのサンプルプログラム *
* (作者 浅野比富美 Public Domain Software) *
*********************************************************************}
program HitAndBlow(input,output) ;
label 999 ; { ギブアップ時のゲーム終了ラベル }
type kurai = array[0..3] of 0..9 ; { 桁の分離用の位配列 }
HBsu = 0..4 ;
var H : HBsu ; { HIT }
B : HBsu ; { BLOW }
answer : integer ; { 解答 }
Number : integer ; { コンピュータの数字 }
time : integer ; { 回数 }
{********** x行y桁にカーソルを移動する **********}
procedure gotoxy(x{行},y{桁}:integer);
type string = packed array[1..2] of char ;
var strX,strY: string ;
procedure make(n:integer; var str: string);
begin
str[1] := chr(n div 10 + ord('0')) ;
str[2] := chr(n mod 10 + ord('0')) ;
end {make};
begin {gotoxy}
make(x,strX);
make(y,strY);
write(chr(27),'[',strX,';',strY,'H');
end {gotoxy};
{********** 4桁の数字nを各ketaに分離する **********}
procedure bunri(n:integer; var keta:kurai);
begin
keta[0] := (n mod 10000) div 1000 ;
keta[1] := (n mod 1000 ) div 100 ;
keta[2] := (n mod 100 ) div 10 ;
keta[3] := n mod 10
end {bunri};
{********** 重複しているか調べる **********}
function chofuku(n:integer) : Boolean ;
var k:kurai ;
begin
bunri(n,k) ;
chofuku := (k[0]=k[1]) or (k[0]=k[2]) or (k[0]=k[3]) or
(k[1]=k[2]) or (k[1]=k[3]) or (k[2]=k[3])
end { chofuku };
{********** HIT,BLOW を計算 **********}
procedure calcHB(No1,No2:integer; var hit,blow:HBsu);
var tk,qk : kurai ;
i,j : 0..3 ;
begin
hit := 0 ;
blow := 0 ;
bunri(No1,tk) ; { No1を各桁に分離 }
bunri(No2,qk) ; { No2を各桁に分離 }
for i:=0 to 3 do
for j:=0 to 3 do
if tk[i]=qk[j] then
if i=j then hit := hit + 1
else blow := blow + 1
end {calcHB};
{********** 答えを入力 **********}
procedure InputAnswer ;
begin
gotoxy(19,1) ;
write('コンピュータの数は? (0を入れるとギブアップ) ') ;
repeat
gotoxy(19,45) ;writeln(' ':10) ; gotoxy(19,45) ;
readln(answer) ;
if answer=0 then { ギブアップ }
begin
gotoxy(21,1) ;
write('コンピュータの数は',Number:4,'です。') ;
goto 999 { ゲーム終わり }
end
until (123<=answer) and (answer<=9876) and not chofuku(answer)
end {InputAnswer};
{********** 初期設定処理 **********}
procedure Init ;
var RD : integer ; { 乱数発生のワーク }
{***** n 未満の乱数を乗算合同法で発生させる関数 ******}
function rand(n:integer): integer;
const MaxInteger = 32767 ;
var i : integer;
begin
RD := RD * 259 ;
if RD > MaxInteger then RD := RD mod MaxInteger ;
rand := RD mod n
end {rand};
begin {Init}
repeat
write('乱数の初期値を入れて下さい(0以外) ?');
readln(RD)
until RD <> 0 ;
repeat
Number := rand(9999)
until not chofuku(Number) ; { 重複しない数になるまで乱数を発生させる }
page ; { タイトルと表を表示 }
writeln(' ':25,'** HIT & BLOW **');
writeln ;
writeln(' ':25,'回数: ????(hHbB)') ;
writeln(' ':25,'----------------') ;
time := 0 { 回数クリア }
end {Init};
begin {main}
Init ;
repeat
InputAnswer ;
calcHB(Number,answer,H,B) ; { HIT、BLOWを計算 }
time := time + 1 ;
gotoxy(time+4,26) ; { 回数対応のところにカーソルを移動する }
writeln(time:4,':',answer:5,'(',H:1,'H',B:1,'B)');
until Number = answer ;
writeln(' ':25,'----- 正解 -----') ;
999 :
end.